class ComponenteEmpreendimento < ActiveRecord::Base

  default_scope :order => :nome

  # Associations
  belongs_to :empreendimento

  # Validations
  validates_presence_of  :empreendimento, :nome, :cpf, :cargo
  validates_presence_of  :mandato_inicio
  validates_presence_of  :mandato_fim, :if => :conselho
  validates_inclusion_of :conselho, :in => [true, false]
  validates_cpf_of       :cpf

  validates_uniqueness_of :cpf, :scope => [:empreendimento_id, :conselho]

  validate :mandato_inicio_no_passado, :mandato_fim_depois_do_inicio

  def mandato_inicio_no_passado
    if mandato_inicio
      errors.add(:mandato_inicio, 'deve ser anterior à data atual') unless mandato_inicio.past?
    end
  end

  def mandato_fim_depois_do_inicio
    if mandato_inicio && mandato_fim
      errors.add_to_base 'Fim do mandato deve ser posterior ao início' unless mandato_fim > mandato_inicio
    end
  end

  # Callbacks
  def before_destroy
    if gerente? && empreendimento.gerentes.count <= 1
      errors.add_to_base "Impossível excluir componente da diretoria/gerência/administração. Ao menos um deve ser informado."
      false
    end
  end

  # mantém a versão de nome dada como gerente/diretor
  def before_save
    if conselho
      equivalente = empreendimento.gerentes.find_by_cpf(cpf)
      self.nome = equivalente.nome if equivalente
    else
      equivalente = empreendimento.conselheiros.find_by_cpf(cpf)
      equivalente.update_attribute(:nome, nome) if equivalente
    end
  end

  # Helpers
  def gerente?
    !conselho
  end

  # FIXME DRY (tb tem em user, acionista e pj) (acts_as_cpf)
  def cpf=(value)
    self[:cpf] = value.gsub(/\D/, "")
  end

  # TODO DRY
  def formatted_mandato_inicio
    I18n.l(mandato_inicio) if mandato_inicio
  end

  def formatted_mandato_fim
    I18n.l(mandato_fim) if mandato_fim
  end

  def formatted_cpf
    "#{cpf[0,3]}.#{cpf[3,3]}.#{cpf[6,3]}-#{cpf[9,2]}"
  end

end
